package org.zhangyp.pdf;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.zhangyp.MysqlUtil;

import java.io.File;
import java.io.IOException;
import java.util.*;

/**
 * PDF文档读取示例类
 * 使用Apache PDFBox库读取PDF文档内容
 */
public class PDFReader {

    // 示例主方法，用于测试PDF读取功能
    public static void main(String[] args) {

        MysqlUtil util = new MysqlUtil("root", "ZxZl@610016", "14.103.177.16", "drg_group", "3306");

        // 替换为您的PDF文件路径
        String pdfFilePath = "D:\\work\\chaimi\\DRG\\CHS-DRG 2.0.pdf";

        List<HashMap<String, Object>> mdcMapList = util.PreparedStatement("select * from dict_mdc");
        List<String> mdcCodeList = mdcMapList.stream().map(mdc -> mdc.get("mdc_code").toString()).toList();
        System.out.println("缓存mdc数据条数：" + mdcCodeList.size());

        List<HashMap<String, Object>> adrgMapList = util.PreparedStatement("select * from dict_adrg");
        List<String> adrgCodeList = adrgMapList.stream().map(mdc -> mdc.get("adrg_code").toString()).toList();
        System.out.println("缓存adrg数据条数：" + adrgCodeList.size());

        List<HashMap<String, Object>> adrgSurgeryMapList = util.PreparedStatement("select * from dict_adrg_surgery");
        List<HashMap<String, Object>> adrgZdMapList = util.PreparedStatement("select * from dict_adrg_zd");
        Map<String, String> adrgDataMap = new HashMap<>();
        for (HashMap<String, Object> adrgSurgeryMap : adrgSurgeryMapList) {
            adrgDataMap.put(adrgSurgeryMap.get("surgery_code").toString(), adrgSurgeryMap.get("surgery_name").toString());
        }

        for (HashMap<String, Object> adrgZdMap : adrgZdMapList) {
            adrgDataMap.put(adrgZdMap.get("zd_code").toString(), adrgZdMap.get("zd_name").toString());
        }

        System.out.println("缓存诊断或手术数据条数：" + adrgDataMap.size());


        PDDocument document = null;
        try {
            // 加载PDF文档
            document = PDDocument.load(new File(pdfFilePath));

            // 创建PDF文本提取器
            PDFTextStripper textStripper = new PDFTextStripper();

            // 设置提取文本的起始页和结束页（可选，默认提取所有页）
            // 标题、序言、目录占23页
            int basePage = 22;
            // 获取页码上的第m页~第n页
            int m = 43;
            int n = 1135;

            textStripper.setStartPage(basePage + m);
            textStripper.setEndPage(basePage + n);
            // 提取文本内容
            String text = textStripper.getText(document);

            // 按换行符分割文本为行
            String[] lines = text.split("\\r?\\n");
            System.out.println("共从PDF读取行数：" + lines.length);

            /*// 逐行输出文本
            System.out.println("=== 开始逐行输出PDF内容（共" + lines.length + "行） ===");
            Set<String> set = new HashSet<>();
            for (int i = 0; i < lines.length; i++) {
                // 去除每行首尾的空白字符
                String line = lines[i].trim();
                // 使用自定义方法分割前两个空格
                //String[] parts = splitFirstOneSpaces(line);
                if (line.contains("包含") || line.contains("入组")) {
                    set.add(line);
                }
            }
            for (String key : set) {
                System.out.println(key);
            }*/


            // 使用自定义的分割方法，只分割前两个空格
            int count = 0;
            String mdcCode = "";
            String adrgCode = "";
            String preDataCode = "";
            List<List<String>> dataValuesList = new ArrayList<>();
            List<List<String>> mainValuesList = new ArrayList<>();
            List<List<String>> factorValuesList = new ArrayList<>();

            for (int i = 0; i < lines.length; i++) {
                String line = lines[i].trim();
                try {
                    Integer.parseInt(line);
                } catch (NumberFormatException e) {
                    // 不是数字，继续处理
                    count++;
                    // 使用自定义方法分割前两个空格
                    String[] parts = splitFirstOneSpaces(line);
                    boolean factorFlag = true;
                    if (parts.length == 2) {
                        String value1 = parts[0];
                        if (mdcCodeList.contains(value1)) {
                            mdcCode = value1;
                            adrgCode = "";
                            preDataCode = "";
                            factorFlag = false;
                        } else if (adrgCodeList.contains(value1)) {
                            adrgCode = value1;
                            preDataCode = "";
                            factorFlag = false;
                        } else if (adrgDataMap.containsKey(value1) || value1.contains(".")) {
                            factorFlag = false;
                            preDataCode = value1;
                            String value2;
                            if(adrgDataMap.containsKey(value1)){
                                value2 = adrgDataMap.get(value1);
                            } else {
                                value2 = parts[1];
                            }
                            if (value1.contains("'")) {
                                value1 = value1.replace("'", "\\'");
                            }
                            if (value2.contains("'")) {
                                value2 = value2.replace("'", "\\'");
                            }
                            if (!adrgCode.isEmpty()) {
                                List<String> dataValues = new ArrayList<>();
                                dataValues.add("'" + value1 + "'");
                                dataValues.add("'" + value2 + "'");
                                dataValues.add("'" + adrgCode + "'");
                                dataValues.add("'" + mdcCode + "'");
                                dataValues.add("" + count);
                                dataValuesList.add(dataValues);

                                if (dataValuesList.size() == 1000) {
                                    insertAdrgData(dataValuesList, util);
                                    dataValuesList.clear();
                                }
                            } else {
                                // 是主诊表
                                List<String> mainValues = new ArrayList<>();
                                mainValues.add("'" + value1 + "'");
                                mainValues.add("'" + value2 + "'");
                                mainValues.add("'" + mdcCode + "'");
                                mainValues.add("" + count);
                                mainValuesList.add(mainValues);

                                if (mainValuesList.size() == 1000) {
                                    insertMdcMain(mainValuesList, util);
                                    mainValuesList.clear();
                                }
                            }
                        } else {
                            System.out.println(parts[0] + "   " + parts[1]);
                        }
                    }
                    if (factorFlag) {
                        List<String> factorValues = new ArrayList<>();
                        if (line.contains("'")) {
                            line = line.replace("'", "\\'");
                        }
                        factorValues.add("'" + line + "'");
                        factorValues.add(adrgCode.isEmpty()?"NULL":"'" + adrgCode + "'");
                        factorValues.add("'" + mdcCode + "'");
                        factorValues.add("" + count);
                        factorValues.add(preDataCode.isEmpty()?"NULL":"'" + preDataCode + "'");
                        factorValuesList.add(factorValues);

                        if (factorValuesList.size() == 1000) {
                            insertFactorData(factorValuesList, util);
                            factorValuesList.clear();
                        }
                        preDataCode = "";
                    }
                }

            }
            if (!dataValuesList.isEmpty()) {
                insertAdrgData(dataValuesList, util);
            }
            if (!mainValuesList.isEmpty()) {
                insertMdcMain(mainValuesList, util);
            }
            if (!factorValuesList.isEmpty()) {
                insertFactorData(factorValuesList, util);
            }
            System.out.println("提取有效数据行数：" + count);
            //关流
            util.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭文档
            if (document != null) {
                try {
                    document.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private static void insertAdrgData(List<List<String>> valuesList, MysqlUtil util) {
        List<String> valuesSql = new ArrayList<>();
        for (List<String> row : valuesList) {
            valuesSql.add("(" + String.join(",", row) + ")");
        }
        String sql = "INSERT INTO dict_adrg_data (data_code, data_name, adrg_code, mdc_code, seq) VALUES " + String.join(",", valuesSql) + ";";
        util.Insert(sql);
    }

    private static void insertMdcMain(List<List<String>> valuesList, MysqlUtil util) {
        List<String> valuesSql = new ArrayList<>();
        for (List<String> row : valuesList) {
            valuesSql.add("(" + String.join(",", row) + ")");
        }
        String sql = "INSERT INTO dict_mdc_main_zd (zd_code, zd_name, mdc_code, seq) VALUES " + String.join(",", valuesSql) + ";";
        util.Insert(sql);
    }

    private static void insertFactorData(List<List<String>> valuesList, MysqlUtil util) {
        List<String> valuesSql = new ArrayList<>();
        for (List<String> row : valuesList) {
            valuesSql.add("(" + String.join(",", row) + ")");
        }
        String sql = "INSERT INTO factor_temp (factor_desc, adrg_code, mdc_code, seq, pre_data_code) VALUES " + String.join(",", valuesSql) + ";";
        util.Insert(sql);
    }

    /**
     * 自定义方法：只分割字符串中的前一个空格
     *
     * @param input 输入字符串
     * @return 分割后的字符串数组，最多包含3个元素
     */
    public static String[] splitFirstOneSpaces(String input) {
        /*if (input.contains("手术或操作")) {
            // 一些特殊关键字，不分割
            return new String[]{input};
        }*/

        // 查找第一个空格的位置
        int firstSpacePos = input.indexOf(" ");

        if (firstSpacePos == -1) {
            // 没有空格，返回原字符串
            return new String[]{input};
        }
        // 分割成两部分
        return new String[]{
                input.substring(0, firstSpacePos).trim(),
                input.substring(firstSpacePos + 1).trim()
        };
    }

    /**
     * 自定义方法：只分割字符串中的前两个空格
     *
     * @param input 输入字符串
     * @return 分割后的字符串数组，最多包含3个元素
     */
    public static String[] splitFirstTwoSpaces(String input) {
        // 查找第一个空格的位置
        int firstSpacePos = input.indexOf(" ");

        if (firstSpacePos == -1) {
            // 没有空格，返回原字符串
            return new String[]{input};
        }

        // 查找第二个空格的位置（从第一个空格之后开始找）
        int secondSpacePos = input.indexOf(" ", firstSpacePos + 1);

        if (secondSpacePos == -1) {
            // 只有一个空格，分割成两部分
            return new String[]{
                    input.substring(0, firstSpacePos).trim(),
                    input.substring(firstSpacePos + 1).trim()
            };
        }

        // 有两个或更多空格，分割成三部分
        // 第三部分包含从第二个空格之后的所有内容（包括后续的空格）
        return new String[]{
                input.substring(0, firstSpacePos).trim(),
                input.substring(firstSpacePos + 1, secondSpacePos).trim(),
                input.substring(secondSpacePos + 1)
        };
    }
}

